/*
 * Created on Mar 27, 2006
 *
 */
package ar.edu.utn.frba.gdaia.src.junittest.AbstraerConceptos.Objetivos2007;


import java.util.ArrayList;
import java.util.Date;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;

import junit.framework.Test;
import junit.framework.TestSuite;
import ar.edu.utn.frba.gdaia.src.domain.Canal;
import ar.edu.utn.frba.gdaia.src.domain.ConceptoElemental;
import ar.edu.utn.frba.gdaia.src.domain.Regla;
import ar.edu.utn.frba.gdaia.src.domain.Situacion;
import ar.edu.utn.frba.gdaia.src.main.GDAIA;
import ar.edu.utn.frba.gdaia.src.test.TestSetup;
import ar.edu.utn.frba.gdaia.src.util.ListBuilder;


/**
 * @author Fernando
 *
 */
public class TestsAbstraerConceptos {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		junit.swingui.TestRunner.run(TestsAbstraerConceptos.class);
	}

	/**
	 * @return a 
	 */
	public static Test suite() {
		TestSetup.main(null);
		System.out.println("Iniciando Suite de Test: Lista Corta");
		TestSuite suite = new TestSuite();
		// $JUnit-BEGIN$

		GDAIA gdaia = new GDAIA();
		gdaia.setCerebro(gdaia.generateCerebroFromXML());

		/*
		TextInterface gui = new ConcreteGUIInterface();
		gdaia.setInterfaceGUI(gui);
		Thread tgui = new Thread(new Ventana(gui));
		tgui.run();
		*/
		
		// Preparamos las variables assert a comparar
		ConceptoElemental assertConceptoTres = new ConceptoElemental(1, "Tres", Canal.TECLADO);
		ConceptoElemental assertConceptoP = new ConceptoElemental(2, "P", Canal.TECLADO);
		ConceptoElemental assertConcepto3 = new ConceptoElemental(3, "3", Canal.TECLADO);
		ConceptoElemental assertConceptoIII = new ConceptoElemental(4, "III", Canal.TECLADO);
		ConceptoElemental assertConceptoA = new ConceptoElemental(5, "A", Canal.TECLADO);
		
		//concepto abstraido: [3, III, Tres]
		ConceptoElemental assertConceptoAbstraido = new ConceptoElemental(-10105, null, Canal.INT_ABSTRAER_CONCEPTOS);
		assertConceptoAbstraido.addHijo(assertConcepto3);
		assertConceptoAbstraido.addHijo(assertConceptoIII);
		assertConceptoAbstraido.addHijo(assertConceptoTres);
	
		// [Tres, P]
		Situacion assertSituacionTresP = new Situacion(new ListBuilder().add(assertConceptoTres).add(assertConceptoP).get(), Canal.INT_MAKE_PRESENT_SIT);
		// [P, P, P]
		Situacion assertSituacionPPP = new Situacion(new ListBuilder().add(assertConceptoP).add(assertConceptoP).add(assertConceptoP).get(), Canal.INT_MAKE_PRESENT_SIT);
		// [3, P]
		Situacion assertSituacion3P = new Situacion(new ListBuilder().add(assertConcepto3).add(assertConceptoP).get(), Canal.INT_MAKE_PRESENT_SIT);
		// [III, P]
		Situacion assertSituacionIIIP = new Situacion(new ListBuilder().add(assertConceptoIII).add(assertConceptoP).get(), Canal.INT_MAKE_PRESENT_SIT);
		// situacion abstraida: [[3, III, Tres], P]]
		Situacion assertSituacionAbstraida_3IIITres_P = new Situacion(new ListBuilder().add(assertConceptoAbstraido).add(assertConceptoP).get(), Canal.INT_ABSTRAER_CONCEPTOS);
		//[III, A]
		Situacion assertSituacionIIIA = new Situacion(new ListBuilder().add(assertConceptoIII).add(assertConceptoA).get(), Canal.INT_MAKE_PRESENT_SIT);
		// [A, A, A]
		Situacion assertSituacionAAA = new Situacion(new ListBuilder().add(assertConceptoA).add(assertConceptoA).add(assertConceptoA).get(), Canal.INT_MAKE_PRESENT_SIT);
		
		
		//assert de reglas para la lista corta
		// [Tres, P] -> [P, P, P]
		Regla assertReglaTresP_PPP = new Regla(-1, null, new Date(),assertSituacionTresP, null, assertSituacionPPP, Canal.INT_LERN_RULE);
		// [3, P] -> [P, P, P]
		Regla assertRegla3P_PPP = new Regla(-2, null, new Date(),assertSituacion3P, null, assertSituacionPPP, Canal.INT_LERN_RULE);
		// [III, P] -> [P, P, P]
		Regla assertReglaIIIP_PPP = new Regla(-3, null, new Date(),assertSituacionIIIP, null, assertSituacionPPP, Canal.INT_LERN_RULE);
		// [III, P] -> [P, P, P]
		Regla assertReglaIIIA_AAA = new Regla(-4, null, new Date(),assertSituacionIIIA, null, assertSituacionAAA, Canal.INT_LERN_RULE);

		// regla abstraida: [[3, III, Tres], P] -> [P, P, P]
		Regla assertRegla_3IIITres_P_PPP = new Regla(-4, null, new Date(),assertSituacionAbstraida_3IIITres_P, null, assertSituacionPPP, Canal.INT_LERN_RULE);
		
		// LearnRule: Tres P -> P P P
		LearnRuleCommandTest learnRuleCommandTestNew = new LearnRuleCommandTest("testExecute", gdaia, assertSituacionTresP, assertSituacionPPP, assertReglaTresP_PPP);
		suite.addTest(learnRuleCommandTestNew);

		// LearnRule: 3 P -> P P P
		learnRuleCommandTestNew = new LearnRuleCommandTest("testExecute", gdaia, assertSituacion3P, assertSituacionPPP, assertRegla3P_PPP);
		suite.addTest(learnRuleCommandTestNew);
		
		// LearnRule: III P -> P P P
		learnRuleCommandTestNew = new LearnRuleCommandTest("testExecute", gdaia, assertSituacionIIIP, assertSituacionPPP, assertReglaIIIP_PPP);
		suite.addTest(learnRuleCommandTestNew);

		// LearnRule: III A -> A A A
		learnRuleCommandTestNew = new LearnRuleCommandTest("testExecute", gdaia, assertSituacionIIIA, assertSituacionAAA, assertReglaIIIA_AAA);
		suite.addTest(learnRuleCommandTestNew);

		
		ArrayList assertsListasCortas = new ArrayList();
		
		//Listas Cortas
		//1 : null
		//2 : null
		//3 : null
		//4 : null
		//5 : assertListaCorta1
		//6 : null
		//7 : null
		//8 : assertListaCorta1
		//9 : null
		//10: null
		//11: assertListaCorta1
		//12: null
		
		//1
		Set assertListaCorta2 = new HashSet();
		assertListaCorta2.add(null);
		assertsListasCortas.add(assertListaCorta2);
		
		//2
		Set assertListaCorta1 = new HashSet();
		assertListaCorta1.add(assertReglaTresP_PPP);
		assertListaCorta1.add(assertRegla3P_PPP);
		assertListaCorta1.add(assertReglaIIIP_PPP);
		assertsListasCortas.add(assertListaCorta2);
		
		//3
		assertsListasCortas.add(assertListaCorta2);
		
		//4
		assertsListasCortas.add(assertListaCorta2);
		
		//5
		assertsListasCortas.add(assertListaCorta1);
		
		//6
		assertsListasCortas.add(assertListaCorta2);
		
		//7
		assertsListasCortas.add(assertListaCorta2);
		
		//8
		assertsListasCortas.add(assertListaCorta1);
		
		//9
		assertsListasCortas.add(assertListaCorta2);
		
		//10
		assertsListasCortas.add(assertListaCorta2);
		
		//11
		assertsListasCortas.add(assertListaCorta1);
		
		//12
		assertsListasCortas.add(assertListaCorta2);
		
		ArrayList assertsConceptos = new ArrayList();
		assertsConceptos.add(assertConceptoAbstraido);
		
		ArrayList assertsReglas = new ArrayList();
		assertsReglas.add(assertRegla_3IIITres_P_PPP);
				
		AbstraerConceptosCommandTest hacerListaCommandTestDormido = new AbstraerConceptosCommandTest("testExecute", gdaia, assertsListasCortas, assertsConceptos, assertsReglas);
		suite.addTest(hacerListaCommandTestDormido);
	
		gdaia.generateXMLForCerebro(gdaia.getCerebro());
		System.out.println("Fin Nuevo Suite de Test");

		return suite;
	}
}
